js 模拟弹簧运动

速度图

Alt text

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(function step(x,v){
var result= (function stepper(x, v) {
var frameRate =1/60, destX = 0, k =100, b = 20,errorMargin = 0.00001;
// 弹簧拉力 = 弹性系数 * 拉伸距离
var Fspring = -k * (x - destX);
// Fdamper = (cpsv^2)/2
// 简化
// 阻力 = 阻力系数* 阻力系数
var Fdamper = -b * v;
//F=ma m忽略
var a = Fspring + Fdamper;
// if (window.hackOn) frameRate = 1 / 300;
var newV = v + a * frameRate;
var newX = x + newV * frameRate;
if (Math.abs(newV - v) < errorMargin && Math.abs(newX - x) < errorMargin) {
return [destX, 0];
}
return [newX, newV];
})(x,v)
if(result[0]>0.1){
step(result[0],result[1])
}
})(300,60)